Dans ce projet,On se propose d’estimer et de projeter la mortalité de deux cohortes d’assurés britanniques afin de calculer la valeur actuelle probable d’un produit de rente viagère à termes anticipés. La rente étant de 10 000 euros par an,payée au 31 décembre.

Installation des packages :

#install.packages("StMoMo")
#install.packages("forecast")
#install.packages("demography")

Chargement des packages :

library("demography")
library("forecast")

Choix des données à partir de Human Mortality Database :

#United Kingdom
# -- UK Total Population    GBR_NP
# -- England & Wales Total Population   GBRTENW
# -- England & Wales Civilian Population    GBRCENW
# -- Scotland   GBR_SCO
# -- Northern Ireland   GBR_NIR

En utilisant la commande hmd.mx() : label U.K : “GBR_NP” #### hmd.mx : lit les données “Mx” (1x1) de la base de données sur la mortalité humaine et construit un objet demogdata #### hmd.pop : lit les données “Population” (1x1) du HMD et construit un objet demogdata

DEATH = hmd.mx("GBR_NP", username="alikhemakhem01@gmail.com",password="Alikh220901*", label = "les taux démographiques - United Kingdom")
EXPOSURE = hmd.pop("GBR_NP", username="alikhemakhem01@gmail.com",password="Alikh220901*", label = "les numéros de population - United Kingdom")
demogUK <- read.demogdata(file="Mx_1x1.txt", 
                           popfile="Exposures_1x1.txt",
                           type="mortality", label="United Kingdom Total Population")

Manipulation des données HMD télécharger :

class(demogUK) # type vérifié
[1] "demogdata"
names(demogUK)
[1] "type"   "label"  "lambda" "year"   "age"    "rate"   "pop"   

résumé :

summary(demogUK)
Mortality data for United Kingdom Total Population
    Series: female male total
    Years: 1922 - 2021
    Ages:  0 - 110 

Pour le Royaume-Uni, la série de mortalité commence en 1922, donc nous pouvons montrer et afficher les taux de mortalité pour la cohorte féminine nés en 1960 pour les 60 ans . Les taux de mortalité par cohorte aux plus jeunes âges sont indiqués comme manquants (notés “.”). De même, la série de mortalité se termine en 2021, nous pouvons montrer les taux de mortalité pour la cohorte de 1960 jusqu’à 29 ans car au 31 décembre 2021, tous les membres de cette cohorte ont atteint l’âge de 61 ans. Pourtant, les données de mortalité pour 61 ans resteront incomplètes jusqu’au 31 décembre 2022.


### Affichage des objets demogdata :
#### 1)En fonction de l’ages en axes des abscisses

graphe taux de mortalité de la polpulation féminine en fonction de l’age :

####par(mar=c(1, 1, 1, 1 ), xpd=TRUE)

plot(demogUK, series = 'female')
## avec légendes des années  
legend("bottomright",legend=unique(demogUK$year),
       col=rainbow(length(demogUK$year)*1.25), ncol=5, pch=3, 
       title="Year", cex=0.6 )

Les lignes forment une courbe en forme de U, indiquant des taux de mortalité plus élevés aux âges plus jeunes et plus avancés. Cela suggère que les taux de mortalité sont généralement plus élevés pour les nouveau-nés et les personnes très âgées par rapport à la mortalité totale par âge.

Affichage ‘femme’ VS ‘total’ en fonction de l’age :

#par(mar=c(1, 1, 1, 1 ), xpd=TRUE)

par(mfrow=c(1,3))
plot(demogUK,series="male",datatype="rate", main="Taux d'hommes")
plot(demogUK,series="female",datatype="rate", main="Taux de femmes")
plot(demogUK,"total",datatype="rate", main="Taux total")

Pour la population anglaise , ces graphes présentent les 3 schémas du logarithme des taux de mortalité en fonction de lâge . On remarque plusieurs comportements , on constate que :

Les femmes sont également épargnées du pic de mortalité que la courbe rencontrée chez les hommes à la sortie de l’adolescence. Cela est probablement dû au fait que les normes culturelles imposent souvent aux hommes une tendance à prendre plus de risques pour s’affirmer à la sortie de l’adolescence . #taux de mortalité pour les années extemes :

# pour l'année 1960 :
plot(demogUK$age, log(demogUK$rate$female[,"1960"]), main ='Femme log taux de mortalité  (demogUK, 1960)',
     xlab = "Ages x", ylab = "Femme log taux de mortalité", type = "l", col = "red")

# pour l'année 2020 :
plot(demogUK$age, log(demogUK$rate$female[,"2020"]), main ='Femme log taux de mortalité (demoUK, 2020)',
     xlab = "Ages x", ylab = "Femme log taux de mortalité", type = "l", col = "red")

taux de mortalité pendant la 2éme guerre mondiale () :

UK_years = c(1939:1945)
plot(demogUK, series = 'female', years = UK_years ,
     main = "demogUK female taux de mortalité entre les années 1939 à 1945"
     )
legend(x="bottomright", legend = UK_years,
       col = rainbow(length(UK_years)*1.25),
       lty = 1,
       cex=0.7,
       box.lwd = 0.3
       )

Affichage des objets demogdata :

2)En fonction des années en axes des abscisses

taux de mortalité entre les années 1960 au 2020 :

UK_years = c(1960:2020)
par(mar=c(1, 1, 1, 1 ), xpd=TRUE)
plot(demogUK, series = 'female', years = UK_years ,
     main = "demogUK female taux de mortalité entre les années 1960 à 2020"
     )
colfunc <- colorRampPalette(c("red", "blue"))
legend(legend=unique(demogUK$year),
       col=colfunc(20), ncol=5, pch=19, 
       title="Year", cex=0.6, "bottomright")

graphe taux de mortalité de la polpulation féminine en fonction des années :

plot(demogUK,series="female",datatype="rate", main="Taux de femmes",plot.type="time",xlab="Age")
legend(legend=unique(demogUK$age),
       col=colfunc(20), ncol=20, pch=19, 
       title="Age", cex=0.4, "bottomright")

#install.packages("plotly")
#library(plotly)

observation population féminine :

on remarque que les taux de mortalité sont les plus élevés pour les personnes âgés : colorés en mauve et ene bleu (au dessus) > 84 ans , ainsi que les nouveaux nées entre 0 et 3 ans , qui diminue au cours des années . on remarque que les taux de mortalité sont les moins élevés pour les personnes jeunes : colorés en orangé (au dessous) ente 20 ans et 24 ans qui diminue au cours des années .

Le log des taux de mortalité en fonction de l’âge et en fonction des années en 3D :

demogUKlog = as.matrix(log(demogUK$rate$total))
demogUKlog[is.infinite(demogUKlog)]<-NA
library(ggplot2)
library(plotly)

Attachement du package : ‘plotly’

L'objet suivant est masqué depuis ‘package:ggplot2’:

    last_plot

L'objet suivant est masqué depuis ‘package:stats’:

    filter

L'objet suivant est masqué depuis ‘package:graphics’:

    layout
p <- plot_ly(z = ~demogUKlog ) %>% add_surface()
p

==>Le comportement des taux de mortalité reste quasi constants durants toutes les années on va prendre en considération tous les années 1922 -to- 2021 ,t ∈ [1922, 2021]

Question 2 :

Estimer les paramètres d’un modèle de Lee-Carter à partir des données historiques téléchargées (on pourra utiliser la fonction fit du package StMoMo). On prendra bien soin de : • Commenter/justifier le choix de la plage d’âge et de la période choisie pour calibrer les données (on pourra les faire varier). • Commenter les résultats obtenus en affichant les paramètres estimés.

# Choix de la période de calibration des données :
par(mfrow=c(1,1))
UK_ages = c(0,10,20,30,40,50,60,70,80,90,100)

plot(demogUK,
     series="female",
     datatype="rate", 
     plot.type="time",
     age = UK_ages,
     main="Taux de mortalité (1922 - 2021) ",axes = F)
# on fixe les axes comme suit :
axis(side = 1, at=1922:2021)
axis(side = 2, at=-10:0)
legend(x="bottomright", legend = UK_ages,
       col = rainbow(length(UK_ages)*1.25), lty = 1, cex=0.6,
       box.lwd = 0.3)

Mise à part l’age 0 le comportement des taux de mortalité reste constant durant toutes les années c’est pour ca qu’on va prendre en considération tous les années 1960 à 2021 ,t ∈ [1960, 2021]

# Choix de la plage d'âges:

x <- demogUK$age[0:110]
                         

plot(x, demogUK$rate$total[0:110,"1960"], 
     type='l', 
     col='red',
     xlab= "Ages x", 
     ylab="volatility", 
     ylim=c(0,1.5),
     main ="Volatilité du taux de mortalité (1960,2021)")

lines(x, demogUK$rate$total[0:110,"1960"], type = 'l', col="green" )
lines(x, demogUK$rate$total[0:110,"1970"], type = 'l', col='orange' )
lines(x, demogUK$rate$total[0:110,"1980"], type = 'l', col="blue" )
lines(x, demogUK$rate$total[0:110,"1990"], type = 'l', col="red" )
lines(x, demogUK$rate$total[0:110,"2000"], type = 'l', col='yellow' )
lines(x, demogUK$rate$total[0:110,"2010"], type = 'l', col="brown" )
lines(x, demogUK$rate$total[0:110,"2015"], type = 'l', col='pink' )
lines(x, demogUK$rate$total[0:110,"2021"], type = 'l', col="purple" )


legend(x="topleft", 
       legend = c("1960","1970","1980","1990","2000","2010","2015","2021"),
       col = c("red","green","orange","blue"), 
       lty = 1, 
       cex=0.6,
       box.lwd = 0.3)

faute d’une forte variabilité des taux de mortalité pour les âges > 100 on va se limiter à choisir x ∈ [0, 100].

#plage d'âges
ages.fit = 0:100
#période de calibration
years.fit = 1960:2021
# Lissage :
## 1- Spline monotone :
demogUK_ls_m <- smooth.demogdata(demogUK,method="mspline")
## 2- Spline standard :
demogUK_ls_s <- smooth.demogdata(demogUK, method="spline")
## 3- Spline Concave :
demogUK_ls_c <- smooth.demogdata(demogUK, method="cspline")
## 4- Spline localement quadratique :
demogUK_ls_q <- smooth.demogdata(demogUK, method="loess")
# comparaison :
plot(demogUK, years=2021, type="p", pch=21, ylim=c(-12, 0), main="UK: MT 2021 - Lissage")
lines(demogUK_ls_m, years=2021, lty=1, col="blue")
lines(demogUK_ls_s, years=2021, lty=2, col="red")
lines(demogUK_ls_c, years=2021, lty=3, col="green")
lines(demogUK_ls_q, years=2021, lty=4, col="black")
legend("topleft",col=c("blue","red","green","black") ,lty=1:4, leg=c("mspline", "spline","cspline","loess"))

===> mspline (lissage monotone) représente le mieux la variation du taux de mortalité

# fitting Lee Carter model :
# séparation des jeux des femmes :
lca.female <- lca(demogUK_ls_m, series="female", adjust="dt",years =years.fit ,ages = ages.fit)

#Paramètre ax:

plot(lca.female$ax, main="Coef. ax sur données britanniques", xlab="Age", ylab="ax", type="l",col="red")

legend("bottomright", c("Female"), cex=0.8,  lty=1:1 ,col="red")

Ce paramètre ax représente la tendance liée à l’effet isolé de l’âge sur les taux de mortalité des femmes(moyenne temporelle du logarithme du taux de mortalité par âge). Les courbes de ax suivent la tendance des courbes des données empiriques. Les âges faibles ont une décroissance jusqu’à atteindre un minimum absolu à de l’âge de 12 ans, puis une croissance exponentielle a partir de l’age de 60 ans .

Paramètre bx:


plot(lca.female$bx, main="Coef. bx sur données britanniques", ylim=c(0,0.03),xlab="Age", ylab="bx", type="l",col="blue")

legend("topright",c("Female"), cex=0.8,  lty=1:1,col="blue")

Le paramètre bx représentent l’interaction de l’effet des années calendaires sur les taux de mortalité. Cet effet est toujours positif mais la valeur ne cesse de diminuer avec l’âge. Autrement dit, l’effet des années calendaires agit majoritairement avant 50 ans et de moins en moins au delà. On constate une bosse à 22 ans et une bosse plus légère à 68 ans. Pour des âges élevés, l’effet est quasi-inexistant puisque bx est presque nul. C’est explicable grâce au fait que l’amélioration des conditions de vie et de la médecine ont diminué largement la mortalité infantile. De plus, chez les hommes, l’année a un plus grand effet que chez les femmes.

Ecart absolu des coefficients :

lca.total <- lca(demogUK_ls_m, series="total", adjust="dt",years =years.fit ,ages = ages.fit)
plot(lca.total$ax-lca.female$ax, main="Ecart avec population totale", xlab="Age x", ylab=expression(paste(Delta, " ax")), type="l" , col='green')
legend("topright",c("Female"), cex=0.8, lty=1:1)

On constate un plus grand écart de mortalité chez les femmes entre 20 et 30 ans que chez les hommes jusqu’à l’âge de 70 ans. La tendance s’inverse puisqu’au delà, l’écart de mortalité est plus grand pour les hommes.

Paramètre kt:

plot(lca.female$kt, xlab="Year", main="Coef. kt sur données britanniques",ylab="kt", type="l",ylim=c(-100, 100))
lines(lca.female$year, y=lca.female$kt, main="kt", lty=2 , col ="red")
legend("topright", c("Female"), cex=0.8, lty=1:1, col ="red")

La tendance à la baisse du coefficient “kt” suggère une amélioration générale de la longévité des femmes au Royaume-Uni au fil du temps. Cela a des implications pour les produits d’assurance vie et de retraite, car une longévité accrue peut signifier que les prestations doivent être payées plus longtemps que prévu

#total
plot(lca.total$residuals)

#female
plot(lca.female$residuals)

- intérprétation des résidus :

La variance instable des résidus pour les âges de 0 à 60 ans suggère que le modèle de Lee-Carter ne capture pas de manière adéquate la dynamique de la mortalité pour ce groupe d’âge.


Le modèle de Lee-Carter semble inadapté pour estimer les taux de mortalité des personnes âgées de moins de 60 ans. Cela souligne la nécessité d’explorer d’autres modèles ou facteurs pour mieux estimer la mortalité pour ce groupe d’âge.

RES=residuals(lca.female,"pearson")
colr=function(k) rainbow(110)[k*100]
couleur=Vectorize(colr)(seq(.01,1,by=.01))
plot(rep(RES$y,length(RES$x)),(RES$z),col=couleur[rep(RES$x,each=length(RES$y))-RES$x[1]+1])

plot(rep(RES$x,each=length(RES$y)),t(RES$z),col=couleur[rep(RES$y,length(RES$x))+1])

#en utilisant la fonction fit du package """StMoMo""" :
# Model de Lee Carter en utilisant le package """StMoMo""" 
# pour les paramétres éstimés on a les memes intérprétations
#install.packages("StMoMo")
library(StMoMo)
Le chargement a nécessité le package : gnm
#________________population féminine________________  :

UK.stmomo.f<-StMoMoData(data=demogUK_ls_m ,series = "female",type="central")
#ajustement du model (fitting) :
LC <- lc(link = "log" )
Lcfit <- fit(LC, data = central2initial(UK.stmomo.f), ages.fit = ages.fit,  years.fit = years.fit)
Avis dans fit.StMoMo(LC, data = central2initial(UK.stmomo.f), ages.fit = ages.fit,  :
  log-Poisson model fitted to initial exposure data
StMoMo: Start fitting with gnm
Initialising
Running start-up iterations..
Running main iterations.......
Done
StMoMo: Finish fitting with gnm
#names(Lcfit)
# paramétre ax :
plot(Lcfit$ax,type='l',col="red")

# paramétre bx ::
plot(Lcfit$bx,type='l',col="blue")

# paramétre kt :
plot(Lcfit$years,Lcfit$kt,type='l',col="green")

Le graphique montre une tendance générale à la baisse du coefficient “kt” du modèle de Lee-Carter, indiquant une amélioration continue de la longévité. Cependant, le pic observé de 2019 à 2021 reflète probablement l’impact significatif de la pandémie de COVID-19 sur les taux de mortalité.


# analyse desidusLelles :
LCres3 <- residuals(Lcfit)
plot(LCres3,type = "scatter") # Scatter plots of deviance residuals for models LC

Ce programme nous permet de simuler les trajectoires futures de l’échantillon à partir d’un modèle de mortalité stochastique, dans notre cas c’est le modèle Lee-Carter qui realise cette simulation. Par défaut, un ARIMA(1, 1, 0) avec une constante est utilisé dans ce programme.

Question 3 :

Simuler un nombre N= 5000 de trajectoires projetées sur 25 ans des taux de mortalité futurs à l’aide de la fonction simulate. • Décrire (en détail) ce que fait le programme. • Afficher les log taux de mortalités projetés pour la cohorte d’assurés, à partir de la date de début du contrat. • Afficher l’histogramme des espérances de vie cohorte à l’âge de 65 ans pour les cohortes d’individus ayant 65 ans en 2000 et 65 ans 2010, et pour la cohorte d’assurés. Commenter.

# Installer les packages nécessaires
install.packages("lifecontingencies")
Error in install.packages : Updating loaded packages

1)Simuler un nombre N= 5000 de trajectoires projetées sur 25 ans des taux de mortalité futurs à l’aide de la fonction simulate :

#Simulation of future mortality rates
N <- 5000 # Number of simulations
years.proj <- 2021:2046 # Projection years (next 25 years)
LCsim <- simulate(Lcfit, h = length(years.proj) , method = mean , nsim = N )

# Trouver l'index de l'année de début du contrat
start_year_index <- which(years.proj == 2021)
print(LCsim)
Simulations of Stochastic Mortality Model
Call: simulate.fitStMoMo(object = Lcfit, nsim = N, h = length(years.proj),  
Call:     method = mean)

Simulation based on
Call: fit.StMoMo(object = LC, data = central2initial(UK.stmomo.f),  
Call:     ages.fit = ages.fit, years.fit = years.fit)

kt model: mrwd
Jump-off method: fit
Years in simulation: 2022 - 2047
Ages in simulation: 0 - 100 

Number of paths: 5000 

2)Afficher les log taux de mortalités projetés pour la cohorte d’assurés, à partir de la date de début du contrat :

plot(Lcfit$years, (Lcfit$Dxt / Lcfit$Ext)["65", ], 
     xlim = range(Lcfit$years, LCsim$years),
     ylim = range((Lcfit$Dxt / Lcfit$Ext)["65", ], LCsim$rates["65", , ]), 
     type = "l", xlab = "year", ylab = "rate", 
     main = "Lee-Carter: Taux de mortalités simulés à partir de 2022")
matlines(LCsim$years, LCsim$rates["65", , ], type = "l", lty = 1)

Le graphique montre que les taux de mortalité simulés à partir de 2022, selon le modèle de Lee-Carter, présentent une variabilité croissante, reflétant l’incertitude inhérente à toute projection à long terme. Cependant, la tendance générale à la baisse de la mortalité semble se poursuivre.

library(fanplot)
probs = c(2.5, 10, 25, 50, 75, 90, 97.5)

qxt <- Lcfit$Dxt / Lcfit$Ext
matplot(Lcfit$years, t(qxt[c("65", "65", "65"), ]),
 xlim = c(1965, 2043), ylim = c(0.0025, 0.2), pch = 20, col = "black",
 log = "y", xlab = "year", ylab = "mortality rate (log scale)")
fan(t(LCsim$rates["65", , ]), start = 2022, probs = probs, n.fan = 4, fan.col = colorRampPalette(c("red", "white")), ln = NULL)

Le graphique montre les taux de mortalité (sur une échelle logarithmique) en fonction du temps. L’utilisation d’une échelle logarithmique permet de mieux visualiser les variations de taux de mortalité, en particulier lorsque les taux varient sur plusieurs ordres de grandeur.


Cependant, après 2022, le graphique montre une grande variabilité dans les taux de mortalité projetés. Cette variabilité, illustrée par la zone ombrée rouge, reflète l’incertitude inhérente à toute projection à long terme. Cette incertitude peut être due à des facteurs tels que les changements futurs dans les conditions de santé, les avancées médicales, les modes de vie et d’autres facteurs socio-économiques.



En conclusion, le passage à une échelle logarithmique permet de mieux visualiser et interpréter les tendances et les variations des taux de mortalité. Cependant, il est important de noter que toute projection à long terme comporte une certaine incertitude.



3)Afficher l’histogramme des espérances de vie cohorte à l’âge de 65 ans pour les cohortes d’individus ayant 65 ans en 2000 et 65 ans 2010, et pour la cohorte d’assurés :

tab<-read.table(file="fltper_1x1.txt", header = TRUE,skip=1, sep = "", dec = ".")
head(tab)
library(lifecontingencies)
##### année 2000 ######
UK_2000<- tab[which(tab$Year == 2000),names(tab)]
df_UK_2000<-data.frame(UK_2000)
df_UK_2000$Age<-as.numeric(as.character(df_UK_2000$Age))
Avis : NAs introduits lors de la conversion automatique
df_UK_2000$Age[111]<-110
TD_2000 <- new("lifetable", x=df_UK_2000$Age, lx= df_UK_2000$lx,name="UK")
ESP_2000=exn(TD_2000,x=65)
ESP_2000
[1] 18.37511
##### année 2010 ######
UK_2010<- tab[which(tab$Year == 2010),names(tab)]
df_UK_2010<-data.frame(UK_2010)
df_UK_2010$Age<-as.numeric(as.character(df_UK_2010$Age))
Avis : NAs introduits lors de la conversion automatique
df_UK_2010$Age[111]<-110
TD_2010 <- new("lifetable", x=df_UK_2010$Age, lx= df_UK_2010$lx,name="UK")
ESP_2010=exn(TD_2010,x=65)
ESP_2010
[1] 20.07817
##### la cohorte de toutes les assures d’assurés ######
bar <- subset(tab, Age == 65)
esp_totale=mean(bar$ex)
esp_totale
[1] 16.4106
#### Histograme #####
kk=c(ESP_2000,ESP_2010,esp_totale)
barplot(kk,
main = "Esperances de vie",
xlab = "Esperance ",
ylab = "Age",
names.arg = c("2000","2010","Total"),
col = "darkred",
horiz = FALSE)

D’après le graphique, l’espérance de vie à 65 ans a augmenté de 2000 à 2010. Cette amélioration peut être attribuée à des facteurs tels que les progrès médicaux, une meilleure nutrition et des modes de vie plus sains.

Question 4 :

Créer une fonction R calculant la valeur actuelle probable de la rente viagère à terme anticipé, étant donnée une liste de taux de mortalité

FemaleUK<-read.table(file="fltper_1x1.txt", header = TRUE,skip=1, sep = "", dec = ".")


VAP=function(x,tab,i, year){
        UK_annee<- tab[which(tab$Year == year),names(tab)]
        df_UK_annee<-data.frame(UK_annee)
        df_UK_annee$Age<-as.numeric(as.character(df_UK_annee$Age))
        df_UK_annee$Age[111]<-110
        TD_annee <- new("lifetable", x=df_UK_annee$Age, lx= df_UK_annee$lx,name="UK")
        VAP_f = axn(TD_annee, x=x, i=i,n=25)
        
        return(VAP_f)
}
#Test de la fonction 
print(VAP(60,FemaleUK,0.03,1960))


Cette fonction est utile car elle permet de calculer la valeur actuelle d’une série de paiements futurs (c’est-à-dire une rente) en tenant compte de la mortalité. Cela est crucial pour la tarification des produits d’assurance vie et de retraite, car cela permet aux actuaires de déterminer combien une compagnie d’assurance ou un régime de retraite doit mettre de côté aujourd’hui pour être en mesure de faire ces paiements futurs.




Avis dans VAP(60, FemaleUK, 0.03, 1960) :
  NAs introduits lors de la conversion automatique
[1] 13.86076

Question 5 :

Calculer la VAP du contrat pour chacun des scénarios de mortalité générés à la question précédente. Donner la valeur moyenne obtenue et sa variance. Proposer une tarification

VAP_scenario1=VAP(65,FemaleUK,0.03,2000)
Avis dans VAP(65, FemaleUK, 0.03, 2000) :
  NAs introduits lors de la conversion automatique
VAP_scenario2=VAP(65,FemaleUK,0.03,2010)
Avis dans VAP(65, FemaleUK, 0.03, 2010) :
  NAs introduits lors de la conversion automatique
c(VAP_scenario1,VAP_scenario2)
[1] 13.81125 14.58216
mean(c(VAP_scenario1,VAP_scenario2))
[1] 14.1967
sd(c(VAP_scenario1,VAP_scenario2))
[1] 0.5451168




En comparant les résultats de la VAP pour les années 2000 et 2010, on peut observer une augmentation de la VAP. Cela suggère que l’espérance de vie à 65 ans a augmenté entre 2000 et 2010.




Tarification : les taux de notre cohorte des individus nées en 1960 :

library(demography)
chosen_cohort=1960
lc_historical_rates <- extractCohort(fitted(Lcfit, type = "rates"), cohort = chosen_cohort)
                                    
lc_sim_rates <- extractCohort(LCsim$rates,cohort = chosen_cohort)
                                     
lc_rates_1960 <- c(lc_historical_rates,lc_sim_rates)

lc_qx_1960 <-mx2qx(lc_rates_1960)


#transformation actuarial table en lifetable:
lc_lifetable_1960 <- probs2lifetable(probs=lc_qx_1960,type = "qx", name = paste("LC","1960","lt",sep="_"))

lc_acttbl_1960<-new("actuarialtable",x=lc_lifetable_1960@x,lx=lc_lifetable_1960@lx)

VAP_hist_projet = axn(lc_acttbl_1960, x=60, n=25) # on a projeté que 25 ans selon le question "3"
VAP_hist_projet
[1] 16.02708
Prime_Propose = axn(lc_acttbl_1960, x=60, m=25)/axn(lc_acttbl_1960, x=60, m=1,n=25) 
Prime_Propose
[1] 0.3626834


La prime proposée est calculée comme le ratio de la VAP sur la valeur actuelle de l’unité de rente payable annuellement pendant 25 ans.





Question 6 :

Quelles sont les autres sources d’incertitudes ?

La VAP dépend de deux facteurs qui sont l’âge de l’assuré et l’interet i

Par rapport à l’âge la VAP croit en fonction de l’âge (corrélation positive) vu que la probabilité de décès augmente en fonction de ce dernier .

Par rapport à l’interet: La VAP est sensible aux taux d’intérêt. Si les taux d’intérêt futurs sont différents de ceux supposés lors du calcul de la VAP, la valeur réelle des paiements de la rente pourrait être différente de la VAP.

LS0tDQp0aXRsZTogIjxkaXYgc3R5bGU9J3RleHQtYWxpZ246IGNlbnRlcjsnPlByb2pldHMgQWN0dWFyaWF0LVZpZSBTdWpldCAzIDo8YnI+IFRhcmlmaWNhdGlvbiBk4oCZdW5lIHJlbnRlIHZpYWfDqHJlIGV0IHByb2plY3Rpb24gZGUgbGEgbW9ydGFsaXTDqSBwYXIgbGUgbW9kw6hsZSBkZSBMZWUtQ2FydGVyPC9kaXY+Ig0Kc3VidGl0bGU6ICI8Yj40IERTIDk8L2I+Ig0KYXV0aG9yOiAiPGI+R3JvdXBlIDQ8L2I+Ig0KZGF0ZTogIjxiPjI4LzA1LzIwMjQ8L2I+Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KPHN0eWxlPg0KaDEudGl0bGUgew0KICBjb2xvcjogcmVkOw0KfQ0KLmF1dGhvci1kYXRlIHsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQo8L3N0eWxlPg0KPHA+RGFucyBjZSBwcm9qZXQsT24gc2UgcHJvcG9zZSBk4oCZZXN0aW1lciBldCBkZSBwcm9qZXRlciBsYSBtb3J0YWxpdMOpIGRlIGRldXggY29ob3J0ZXMgZOKAmWFzc3Vyw6lzIGJyaXRhbm5pcXVlcyBhZmluIGRlIGNhbGN1bGVyIGxhIHZhbGV1ciBhY3R1ZWxsZSBwcm9iYWJsZSBk4oCZdW4gcHJvZHVpdCBkZSByZW50ZSB2aWFnw6hyZSDDoCB0ZXJtZXMgYW50aWNpcMOpcy4gTGEgcmVudGUgw6l0YW50IGRlIDEwIDAwMCBldXJvcyBwYXIgYW4scGF5w6llIGF1IDMxIGTDqWNlbWJyZS48L3A+DQoNCjxiPkluc3RhbGxhdGlvbiBkZXMgcGFja2FnZXMgOjwvYj4NCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoIlN0TW9NbyIpDQojaW5zdGFsbC5wYWNrYWdlcygiZm9yZWNhc3QiKQ0KI2luc3RhbGwucGFja2FnZXMoImRlbW9ncmFwaHkiKQ0KYGBgDQoNCjxiPkNoYXJnZW1lbnQgZGVzIHBhY2thZ2VzIDo8L2I+DQpgYGB7cn0NCmxpYnJhcnkoImRlbW9ncmFwaHkiKQ0KbGlicmFyeSgiZm9yZWNhc3QiKQ0KYGBgDQo8Yj5DaG9peCBkZXMgZG9ubsOpZXMgw6AgcGFydGlyIGRlIEh1bWFuIE1vcnRhbGl0eSBEYXRhYmFzZSA6PC9iPg0KYGBge3J9DQojVW5pdGVkIEtpbmdkb20NCiMgLS0gVUsgVG90YWwgUG9wdWxhdGlvbglHQlJfTlANCiMgLS0gRW5nbGFuZCAmIFdhbGVzIFRvdGFsIFBvcHVsYXRpb24JR0JSVEVOVw0KIyAtLSBFbmdsYW5kICYgV2FsZXMgQ2l2aWxpYW4gUG9wdWxhdGlvbglHQlJDRU5XDQojIC0tIFNjb3RsYW5kCUdCUl9TQ08NCiMgLS0gTm9ydGhlcm4gSXJlbGFuZAlHQlJfTklSDQpgYGANCg0KRW4gdXRpbGlzYW50IGxhIGNvbW1hbmRlIGhtZC5teCgpIDogbGFiZWwgVS5LIDogIkdCUl9OUCINCiMjIyMgaG1kLm14IDogbGl0IGxlcyBkb25uw6llcyAiTXgiICgxeDEpIGRlIGxhIGJhc2UgZGUgZG9ubsOpZXMgc3VyIGxhIG1vcnRhbGl0w6kgaHVtYWluZSBldCBjb25zdHJ1aXQgdW4gb2JqZXQgZGVtb2dkYXRhDQojIyMjIGhtZC5wb3AgOiBsaXQgbGVzIGRvbm7DqWVzICJQb3B1bGF0aW9uIiAoMXgxKSBkdSBITUQgZXQgY29uc3RydWl0IHVuIG9iamV0IGRlbW9nZGF0YQ0KDQpgYGB7cn0NCkRFQVRIID0gaG1kLm14KCJHQlJfTlAiLCB1c2VybmFtZT0iYWxpa2hlbWFraGVtMDFAZ21haWwuY29tIixwYXNzd29yZD0iQWxpa2gyMjA5MDEqIiwgbGFiZWwgPSAibGVzIHRhdXggZMOpbW9ncmFwaGlxdWVzIC0gVW5pdGVkIEtpbmdkb20iKQ0KRVhQT1NVUkUgPSBobWQucG9wKCJHQlJfTlAiLCB1c2VybmFtZT0iYWxpa2hlbWFraGVtMDFAZ21haWwuY29tIixwYXNzd29yZD0iQWxpa2gyMjA5MDEqIiwgbGFiZWwgPSAibGVzIG51bcOpcm9zIGRlIHBvcHVsYXRpb24gLSBVbml0ZWQgS2luZ2RvbSIpDQpkZW1vZ1VLIDwtIHJlYWQuZGVtb2dkYXRhKGZpbGU9Ik14XzF4MS50eHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGZpbGU9IkV4cG9zdXJlc18xeDEudHh0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im1vcnRhbGl0eSIsIGxhYmVsPSJVbml0ZWQgS2luZ2RvbSBUb3RhbCBQb3B1bGF0aW9uIikNCmBgYA0KDQo8Yj5NYW5pcHVsYXRpb24gZGVzIGRvbm7DqWVzIEhNRCB0w6lsw6ljaGFyZ2VyIDo8L2I+DQpgYGB7cn0NCmNsYXNzKGRlbW9nVUspICMgdHlwZSB2w6lyaWZpw6kNCmBgYCANCg0KYGBge3J9DQpuYW1lcyhkZW1vZ1VLKQ0KYGBgDQo8Yj5yw6lzdW3DqSA6PC9iPg0KYGBge3J9DQpzdW1tYXJ5KGRlbW9nVUspDQpgYGANClBvdXIgbGUgUm95YXVtZS1VbmksIGxhIHPDqXJpZSBkZSBtb3J0YWxpdMOpICBjb21tZW5jZSBlbiAxOTIyLCBkb25jIG5vdXMgcG91dm9ucyBtb250cmVyIGV0IGFmZmljaGVyIGxlcyB0YXV4IGRlIG1vcnRhbGl0w6kgcG91ciBsYSBjb2hvcnRlIGbDqW1pbmluZSBuw6lzIGVuIDE5NjAgcG91ciBsZXMgNjAgYW5zIC4gTGVzIHRhdXggZGUgbW9ydGFsaXTDqSBwYXIgY29ob3J0ZSBhdXggcGx1cyBqZXVuZXMgw6JnZXMgc29udCBpbmRpcXXDqXMgY29tbWUgbWFucXVhbnRzIChub3TDqXMgIi4iKS4gRGUgbcOqbWUsIGxhIHPDqXJpZSBkZSBtb3J0YWxpdMOpIHNlIHRlcm1pbmUgZW4gMjAyMSwgbm91cyBwb3V2b25zIG1vbnRyZXIgbGVzIHRhdXggZGUgbW9ydGFsaXTDqSBwb3VyIGxhIGNvaG9ydGUgZGUgMTk2MCBqdXNxdSfDoCAyOSBhbnMgY2FyIGF1IDMxIGTDqWNlbWJyZSAyMDIxLCB0b3VzIGxlcyBtZW1icmVzIGRlIGNldHRlIGNvaG9ydGUgb250IGF0dGVpbnQgbCfDomdlIGRlIDYxIGFucy4gUG91cnRhbnQsIGxlcyBkb25uw6llcyBkZSBtb3J0YWxpdMOpIHBvdXIgNjEgYW5zIHJlc3Rlcm9udCBpbmNvbXBsw6h0ZXMganVzcXUnYXUgMzEgZMOpY2VtYnJlIDIwMjIuDQoNCjxicj4NCiMjIyBBZmZpY2hhZ2UgZGVzIG9iamV0cyBkZW1vZ2RhdGEgOjwvYnI+DQojIyMjIDEpRW4gZm9uY3Rpb24gZGUgbCdhZ2VzIGVuIGF4ZXMgZGVzIGFic2Npc3Nlcw0KDQojIyMjIGdyYXBoZSB0YXV4IGRlIG1vcnRhbGl0w6kgZGUgbGEgcG9scHVsYXRpb24gZsOpbWluaW5lIGVuIGZvbmN0aW9uIGRlIGwnYWdlIDoNCiMjIyNwYXIobWFyPWMoMSwgMSwgMSwgMSApLCB4cGQ9VFJVRSkNCmBgYHtyfQ0KcGxvdChkZW1vZ1VLLCBzZXJpZXMgPSAnZmVtYWxlJykNCiMjIGF2ZWMgbMOpZ2VuZGVzIGRlcyBhbm7DqWVzICANCmxlZ2VuZCgiYm90dG9tcmlnaHQiLGxlZ2VuZD11bmlxdWUoZGVtb2dVSyR5ZWFyKSwNCiAgICAgICBjb2w9cmFpbmJvdyhsZW5ndGgoZGVtb2dVSyR5ZWFyKSoxLjI1KSwgbmNvbD01LCBwY2g9MywgDQogICAgICAgdGl0bGU9IlllYXIiLCBjZXg9MC42ICkNCmBgYA0KIyBvbiByZW1hcnF1ZSBxdWUgbGVzIHRhdXggZGUgbW9ydGFsaXTDqSBzb250IGxlcyBwbHVzIMOpbGV2w6lzIHBvdXIgbGVzIMOiZ2VzIGV4dHLDqm1lcyAobGVzIG5vdXZlYXV4IG7DqXMgLyBsZXMgcGVyc29ubmVzIMOiZ8OpcyApDQoNCiMgQWZmaWNoYWdlICdmZW1tZScgVlMgJ3RvdGFsJyBlbiBmb25jdGlvbiBkZSBsJ2FnZSA6DQojcGFyKG1hcj1jKDEsIDEsIDEsIDEgKSwgeHBkPVRSVUUpDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMykpDQpwbG90KGRlbW9nVUssc2VyaWVzPSJtYWxlIixkYXRhdHlwZT0icmF0ZSIsIG1haW49IlRhdXggZCdob21tZXMiKQ0KcGxvdChkZW1vZ1VLLHNlcmllcz0iZmVtYWxlIixkYXRhdHlwZT0icmF0ZSIsIG1haW49IlRhdXggZGUgZmVtbWVzIikNCnBsb3QoZGVtb2dVSywidG90YWwiLGRhdGF0eXBlPSJyYXRlIiwgbWFpbj0iVGF1eCB0b3RhbCIpDQpgYGANClBvdXIgbGEgcG9wdWxhdGlvbiBhbmdsYWlzZSAsIGNlcyBncmFwaGVzIHByw6lzZW50ZW50IGxlcyAzIHNjaMOpbWFzIGR1IGxvZ2FyaXRobWUgZGVzIHRhdXggZGUgbW9ydGFsaXTDqSBlbiBmb25jdGlvbiBkZSBsw6JnZSAuIE9uIHJlbWFycXVlIHBsdXNpZXVycyBjb21wb3J0ZW1lbnRzICwgb24gY29uc3RhdGUgcXVlIDoNCg0KTGVzIGZlbW1lcyBzb250IMOpZ2FsZW1lbnQgw6lwYXJnbsOpZXMgZHUgcGljIGRlIG1vcnRhbGl0w6kgcXVlIGxhIGNvdXJiZSByZW5jb250csOpZSBjaGV6IGxlcyBob21tZXMgw6AgbGEgc29ydGllIGRlIGzigJlhZG9sZXNjZW5jZS4gQ2VsYSBlc3QgcHJvYmFibGVtZW50IGTDuyBhdSBmYWl0IHF1ZSBsZXMgbm9ybWVzIGN1bHR1cmVsbGVzIGltcG9zZW50IHNvdXZlbnQgYXV4IGhvbW1lcyB1bmUgdGVuZGFuY2Ugw6AgcHJlbmRyZSBwbHVzIGRlIHJpc3F1ZXMgcG91ciBz4oCZYWZmaXJtZXIgw6AgbGEgc29ydGllIGRlIGzigJlhZG9sZXNjZW5jZSAuDQojdGF1eCBkZSBtb3J0YWxpdMOpIHBvdXIgbGVzIGFubsOpZXMgZXh0ZW1lcyA6DQpgYGB7cn0NCiMgcG91ciBsJ2FubsOpZSAxOTYwIDoNCnBsb3QoZGVtb2dVSyRhZ2UsIGxvZyhkZW1vZ1VLJHJhdGUkZmVtYWxlWywiMTk2MCJdKSwgbWFpbiA9J0ZlbW1lIGxvZyB0YXV4IGRlIG1vcnRhbGl0w6kgIChkZW1vZ1VLLCAxOTYwKScsDQogICAgIHhsYWIgPSAiQWdlcyB4IiwgeWxhYiA9ICJGZW1tZSBsb2cgdGF1eCBkZSBtb3J0YWxpdMOpIiwgdHlwZSA9ICJsIiwgY29sID0gInJlZCIpDQpgYGANCg0KYGBge3J9DQojIHBvdXIgbCdhbm7DqWUgMjAyMCA6DQpwbG90KGRlbW9nVUskYWdlLCBsb2coZGVtb2dVSyRyYXRlJGZlbWFsZVssIjIwMjAiXSksIG1haW4gPSdGZW1tZSBsb2cgdGF1eCBkZSBtb3J0YWxpdMOpIChkZW1vVUssIDIwMjApJywNCiAgICAgeGxhYiA9ICJBZ2VzIHgiLCB5bGFiID0gIkZlbW1lIGxvZyB0YXV4IGRlIG1vcnRhbGl0w6kiLCB0eXBlID0gImwiLCBjb2wgPSAicmVkIikNCmBgYA0KIyB0YXV4IGRlIG1vcnRhbGl0w6kgcGVuZGFudCBsYSAyw6ltZSBndWVycmUgbW9uZGlhbGUgKCkgOg0KYGBge3J9DQpVS195ZWFycyA9IGMoMTkzOToxOTQ1KQ0KcGxvdChkZW1vZ1VLLCBzZXJpZXMgPSAnZmVtYWxlJywgeWVhcnMgPSBVS195ZWFycyAsDQogICAgIG1haW4gPSAiZGVtb2dVSyBmZW1hbGUgdGF1eCBkZSBtb3J0YWxpdMOpIGVudHJlIGxlcyBhbm7DqWVzIDE5Mzkgw6AgMTk0NSINCiAgICAgKQ0KbGVnZW5kKHg9ImJvdHRvbXJpZ2h0IiwgbGVnZW5kID0gVUtfeWVhcnMsDQogICAgICAgY29sID0gcmFpbmJvdyhsZW5ndGgoVUtfeWVhcnMpKjEuMjUpLA0KICAgICAgIGx0eSA9IDEsDQogICAgICAgY2V4PTAuNywNCiAgICAgICBib3gubHdkID0gMC4zDQogICAgICAgKQ0KYGBgDQojIEFmZmljaGFnZSBkZXMgb2JqZXRzIGRlbW9nZGF0YSA6DQogICAgMilFbiBmb25jdGlvbiBkZXMgYW5uw6llcyBlbiBheGVzIGRlcyBhYnNjaXNzZXMNCiMgdGF1eCBkZSBtb3J0YWxpdMOpIGVudHJlIGxlcyBhbm7DqWVzIDE5NjAgYXUgMjAyMCA6DQpgYGB7cn0NClVLX3llYXJzID0gYygxOTYwOjIwMjApDQpwYXIobWFyPWMoMSwgMSwgMSwgMSApLCB4cGQ9VFJVRSkNCnBsb3QoZGVtb2dVSywgc2VyaWVzID0gJ2ZlbWFsZScsIHllYXJzID0gVUtfeWVhcnMgLA0KICAgICBtYWluID0gImRlbW9nVUsgZmVtYWxlIHRhdXggZGUgbW9ydGFsaXTDqSBlbnRyZSBsZXMgYW5uw6llcyAxOTYwIMOgIDIwMjAiDQogICAgICkNCmNvbGZ1bmMgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJyZWQiLCAiYmx1ZSIpKQ0KbGVnZW5kKGxlZ2VuZD11bmlxdWUoZGVtb2dVSyR5ZWFyKSwNCiAgICAgICBjb2w9Y29sZnVuYygyMCksIG5jb2w9NSwgcGNoPTE5LCANCiAgICAgICB0aXRsZT0iWWVhciIsIGNleD0wLjYsICJib3R0b21yaWdodCIpDQpgYGANCg0KIyBncmFwaGUgdGF1eCBkZSBtb3J0YWxpdMOpIGRlIGxhIHBvbHB1bGF0aW9uIGbDqW1pbmluZSBlbiBmb25jdGlvbiBkZXMgYW5uw6llcyA6DQpgYGB7cn0NCnBsb3QoZGVtb2dVSyxzZXJpZXM9ImZlbWFsZSIsZGF0YXR5cGU9InJhdGUiLCBtYWluPSJUYXV4IGRlIGZlbW1lcyIscGxvdC50eXBlPSJ0aW1lIix4bGFiPSJBZ2UiKQ0KbGVnZW5kKGxlZ2VuZD11bmlxdWUoZGVtb2dVSyRhZ2UpLA0KICAgICAgIGNvbD1jb2xmdW5jKDIwKSwgbmNvbD0yMCwgcGNoPTE5LCANCiAgICAgICB0aXRsZT0iQWdlIiwgY2V4PTAuNCwgImJvdHRvbXJpZ2h0IikNCmBgYA0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiNsaWJyYXJ5KHBsb3RseSkNCmBgYA0KIyMgb2JzZXJ2YXRpb24gcG9wdWxhdGlvbiBmw6ltaW5pbmUgOg0Kb24gcmVtYXJxdWUgcXVlIGxlcyB0YXV4IGRlIG1vcnRhbGl0w6kgc29udCBsZXMgcGx1cyDDqWxldsOpcyBwb3VyIGxlcyBwZXJzb25uZXMgw6Jnw6lzIDogY29sb3LDqXMgZW4gbWF1dmUgZXQgZW5lIGJsZXUgKGF1IGRlc3N1cykgPiA4NCBhbnMgLCBhaW5zaSBxdWUgbGVzIG5vdXZlYXV4IG7DqWVzIGVudHJlIDAgZXQgMyBhbnMgLCBxdWkgZGltaW51ZSBhdSBjb3VycyBkZXMgYW5uw6llcyAuDQpvbiByZW1hcnF1ZSBxdWUgbGVzIHRhdXggZGUgbW9ydGFsaXTDqSBzb250IGxlcyBtb2lucyDDqWxldsOpcyBwb3VyIGxlcyBwZXJzb25uZXMgamV1bmVzIDogY29sb3LDqXMgZW4gb3JhbmfDqSAoYXUgZGVzc291cykgZW50ZSAyMCBhbnMgZXQgMjQgYW5zIHF1aSBkaW1pbnVlIGF1IGNvdXJzIGRlcyBhbm7DqWVzIC4NCg0KIyBMZSBsb2cgZGVzIHRhdXggZGUgbW9ydGFsaXTDqSBlbiBmb25jdGlvbiBkZSBs4oCZw6JnZSBldCBlbiBmb25jdGlvbiBkZXMgYW5uw6llcyBlbiAzRCA6DQpgYGB7cn0NCmRlbW9nVUtsb2cgPSBhcy5tYXRyaXgobG9nKGRlbW9nVUskcmF0ZSR0b3RhbCkpDQpkZW1vZ1VLbG9nW2lzLmluZmluaXRlKGRlbW9nVUtsb2cpXTwtTkENCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KcCA8LSBwbG90X2x5KHogPSB+ZGVtb2dVS2xvZyApICU+JSBhZGRfc3VyZmFjZSgpDQpwDQpgYGANCg0KDQo9PT5MZSBjb21wb3J0ZW1lbnQgZGVzIHRhdXggZGUgbW9ydGFsaXTDqSByZXN0ZSBxdWFzaSBjb25zdGFudHMgZHVyYW50cyB0b3V0ZXMgbGVzIGFubsOpZXMgb24gdmEgcHJlbmRyZSBlbiBjb25zaWTDqXJhdGlvbiB0b3VzIGxlcyBhbm7DqWVzIDE5MjIgLXRvLSAyMDIxICx0IOKIiCBbMTkyMiwgMjAyMV0NCg0KIyBRdWVzdGlvbiAyIDoNCkVzdGltZXIgbGVzIHBhcmFtw6h0cmVzIGTigJl1biBtb2TDqGxlIGRlIExlZS1DYXJ0ZXIgw6AgcGFydGlyIGRlcyBkb25uw6llcyBoaXN0b3JpcXVlcyB0w6lsw6ljaGFyZ8OpZXMgKG9uIHBvdXJyYSB1dGlsaXNlciBsYSBmb25jdGlvbiBmaXQgZHUgcGFja2FnZSBTdE1vTW8pLiBPbiBwcmVuZHJhIGJpZW4gc29pbiBkZSA6DQrigKIgQ29tbWVudGVyL2p1c3RpZmllciBsZSBjaG9peCBkZSBsYSBwbGFnZSBk4oCZw6JnZSBldCBkZSBsYSBww6lyaW9kZSBjaG9pc2llIHBvdXIgY2FsaWJyZXIgbGVzIGRvbm7DqWVzIChvbiBwb3VycmEgbGVzIGZhaXJlIHZhcmllcikuDQrigKIgQ29tbWVudGVyIGxlcyByw6lzdWx0YXRzIG9idGVudXMgZW4gYWZmaWNoYW50IGxlcyBwYXJhbcOodHJlcyBlc3RpbcOpcy4NCg0KYGBge3J9DQojIENob2l4IGRlIGxhIHDDqXJpb2RlIGRlIGNhbGlicmF0aW9uIGRlcyBkb25uw6llcyA6DQpwYXIobWZyb3c9YygxLDEpKQ0KVUtfYWdlcyA9IGMoMCwxMCwyMCwzMCw0MCw1MCw2MCw3MCw4MCw5MCwxMDApDQoNCnBsb3QoZGVtb2dVSywNCiAgICAgc2VyaWVzPSJmZW1hbGUiLA0KICAgICBkYXRhdHlwZT0icmF0ZSIsIA0KICAgICBwbG90LnR5cGU9InRpbWUiLA0KICAgICBhZ2UgPSBVS19hZ2VzLA0KICAgICBtYWluPSJUYXV4IGRlIG1vcnRhbGl0w6kgKDE5MjIgLSAyMDIxKSAiLGF4ZXMgPSBGKQ0KIyBvbiBmaXhlIGxlcyBheGVzIGNvbW1lIHN1aXQgOg0KYXhpcyhzaWRlID0gMSwgYXQ9MTkyMjoyMDIxKQ0KYXhpcyhzaWRlID0gMiwgYXQ9LTEwOjApDQpsZWdlbmQoeD0iYm90dG9tcmlnaHQiLCBsZWdlbmQgPSBVS19hZ2VzLA0KICAgICAgIGNvbCA9IHJhaW5ib3cobGVuZ3RoKFVLX2FnZXMpKjEuMjUpLCBsdHkgPSAxLCBjZXg9MC42LA0KICAgICAgIGJveC5sd2QgPSAwLjMpDQpgYGANCg0KTWlzZSDDoCBwYXJ0IGzigJlhZ2UgMCBsZSBjb21wb3J0ZW1lbnQgZGVzIHRhdXggZGUgbW9ydGFsaXTDqSByZXN0ZSBjb25zdGFudCBkdXJhbnQgdG91dGVzIGxlcyBhbm7DqWVzIGPigJllc3QgcG91ciBjYSBxdeKAmW9uIHZhIHByZW5kcmUgZW4gY29uc2lkw6lyYXRpb24gdG91cyBsZXMgYW5uw6llcyAxOTYwIMOgIDIwMjEgLHQg4oiIIFsxOTYwLCAyMDIxXQ0KDQpgYGB7cn0NCiMgQ2hvaXggZGUgbGEgcGxhZ2UgZCfDomdlczoNCg0KeCA8LSBkZW1vZ1VLJGFnZVswOjExMF0NCiAgICAgICAgICAgICAgICAgICAgICAgICANCg0KcGxvdCh4LCBkZW1vZ1VLJHJhdGUkdG90YWxbMDoxMTAsIjE5NjAiXSwgDQogICAgIHR5cGU9J2wnLCANCiAgICAgY29sPSdyZWQnLA0KICAgICB4bGFiPSAiQWdlcyB4IiwgDQogICAgIHlsYWI9InZvbGF0aWxpdHkiLCANCiAgICAgeWxpbT1jKDAsMS41KSwNCiAgICAgbWFpbiA9IlZvbGF0aWxpdMOpIGR1IHRhdXggZGUgbW9ydGFsaXTDqSAoMTk2MCwyMDIxKSIpDQoNCmxpbmVzKHgsIGRlbW9nVUskcmF0ZSR0b3RhbFswOjExMCwiMTk2MCJdLCB0eXBlID0gJ2wnLCBjb2w9ImdyZWVuIiApDQpsaW5lcyh4LCBkZW1vZ1VLJHJhdGUkdG90YWxbMDoxMTAsIjE5NzAiXSwgdHlwZSA9ICdsJywgY29sPSdvcmFuZ2UnICkNCmxpbmVzKHgsIGRlbW9nVUskcmF0ZSR0b3RhbFswOjExMCwiMTk4MCJdLCB0eXBlID0gJ2wnLCBjb2w9ImJsdWUiICkNCmxpbmVzKHgsIGRlbW9nVUskcmF0ZSR0b3RhbFswOjExMCwiMTk5MCJdLCB0eXBlID0gJ2wnLCBjb2w9InJlZCIgKQ0KbGluZXMoeCwgZGVtb2dVSyRyYXRlJHRvdGFsWzA6MTEwLCIyMDAwIl0sIHR5cGUgPSAnbCcsIGNvbD0neWVsbG93JyApDQpsaW5lcyh4LCBkZW1vZ1VLJHJhdGUkdG90YWxbMDoxMTAsIjIwMTAiXSwgdHlwZSA9ICdsJywgY29sPSJicm93biIgKQ0KbGluZXMoeCwgZGVtb2dVSyRyYXRlJHRvdGFsWzA6MTEwLCIyMDE1Il0sIHR5cGUgPSAnbCcsIGNvbD0ncGluaycgKQ0KbGluZXMoeCwgZGVtb2dVSyRyYXRlJHRvdGFsWzA6MTEwLCIyMDIxIl0sIHR5cGUgPSAnbCcsIGNvbD0icHVycGxlIiApDQoNCg0KbGVnZW5kKHg9InRvcGxlZnQiLCANCiAgICAgICBsZWdlbmQgPSBjKCIxOTYwIiwiMTk3MCIsIjE5ODAiLCIxOTkwIiwiMjAwMCIsIjIwMTAiLCIyMDE1IiwiMjAyMSIpLA0KICAgICAgIGNvbCA9IGMoInJlZCIsImdyZWVuIiwib3JhbmdlIiwiYmx1ZSIpLCANCiAgICAgICBsdHkgPSAxLCANCiAgICAgICBjZXg9MC42LA0KICAgICAgIGJveC5sd2QgPSAwLjMpDQpgYGANCmZhdXRlIGQndW5lIGZvcnRlIHZhcmlhYmlsaXTDqSBkZXMgdGF1eCBkZSBtb3J0YWxpdMOpIHBvdXIgbGVzIMOiZ2VzID4gMTAwIG9uIHZhIHNlIGxpbWl0ZXIgw6AgY2hvaXNpciB4IOKIiCBbMCwgMTAwXS4NCmBgYHtyfQ0KI3BsYWdlIGQnw6JnZXMNCmFnZXMuZml0ID0gMDoxMDANCiNww6lyaW9kZSBkZSBjYWxpYnJhdGlvbg0KeWVhcnMuZml0ID0gMTk2MDoyMDIxDQpgYGANCg0KYGBge3J9DQojIExpc3NhZ2UgOg0KIyMgMS0gU3BsaW5lIG1vbm90b25lIDoNCmRlbW9nVUtfbHNfbSA8LSBzbW9vdGguZGVtb2dkYXRhKGRlbW9nVUssbWV0aG9kPSJtc3BsaW5lIikNCmBgYA0KDQpgYGB7cn0NCiMjIDItIFNwbGluZSBzdGFuZGFyZCA6DQpkZW1vZ1VLX2xzX3MgPC0gc21vb3RoLmRlbW9nZGF0YShkZW1vZ1VLLCBtZXRob2Q9InNwbGluZSIpDQpgYGANCg0KDQpgYGB7cn0NCiMjIDMtIFNwbGluZSBDb25jYXZlIDoNCmRlbW9nVUtfbHNfYyA8LSBzbW9vdGguZGVtb2dkYXRhKGRlbW9nVUssIG1ldGhvZD0iY3NwbGluZSIpDQpgYGANCg0KYGBge3J9DQojIyA0LSBTcGxpbmUgbG9jYWxlbWVudCBxdWFkcmF0aXF1ZSA6DQpkZW1vZ1VLX2xzX3EgPC0gc21vb3RoLmRlbW9nZGF0YShkZW1vZ1VLLCBtZXRob2Q9ImxvZXNzIikNCmBgYA0KDQpgYGB7cn0NCiMgY29tcGFyYWlzb24gOg0KcGxvdChkZW1vZ1VLLCB5ZWFycz0yMDIxLCB0eXBlPSJwIiwgcGNoPTIxLCB5bGltPWMoLTEyLCAwKSwgbWFpbj0iVUs6IE1UIDIwMjEgLSBMaXNzYWdlIikNCmxpbmVzKGRlbW9nVUtfbHNfbSwgeWVhcnM9MjAyMSwgbHR5PTEsIGNvbD0iYmx1ZSIpDQpsaW5lcyhkZW1vZ1VLX2xzX3MsIHllYXJzPTIwMjEsIGx0eT0yLCBjb2w9InJlZCIpDQpsaW5lcyhkZW1vZ1VLX2xzX2MsIHllYXJzPTIwMjEsIGx0eT0zLCBjb2w9ImdyZWVuIikNCmxpbmVzKGRlbW9nVUtfbHNfcSwgeWVhcnM9MjAyMSwgbHR5PTQsIGNvbD0iYmxhY2siKQ0KbGVnZW5kKCJ0b3BsZWZ0Iixjb2w9YygiYmx1ZSIsInJlZCIsImdyZWVuIiwiYmxhY2siKSAsbHR5PTE6NCwgbGVnPWMoIm1zcGxpbmUiLCAic3BsaW5lIiwiY3NwbGluZSIsImxvZXNzIikpDQpgYGANCj09PT4gbXNwbGluZSAobGlzc2FnZSBtb25vdG9uZSkgcmVwcsOpc2VudGUgbGUgbWlldXggbGEgdmFyaWF0aW9uIGR1IHRhdXggZGUgbW9ydGFsaXTDqQ0KDQpgYGB7cn0NCiMgZml0dGluZyBMZWUgQ2FydGVyIG1vZGVsIDoNCiMgc8OpcGFyYXRpb24gZGVzIGpldXggZGVzIGZlbW1lcyA6DQpsY2EuZmVtYWxlIDwtIGxjYShkZW1vZ1VLX2xzX20sIHNlcmllcz0iZmVtYWxlIiwgYWRqdXN0PSJkdCIseWVhcnMgPXllYXJzLmZpdCAsYWdlcyA9IGFnZXMuZml0KQ0KYGBgDQoNCiNQYXJhbcOodHJlICBheDoNCmBgYHtyfQ0KcGxvdChsY2EuZmVtYWxlJGF4LCBtYWluPSJDb2VmLiBheCBzdXIgZG9ubsOpZXMgYnJpdGFubmlxdWVzIiwgeGxhYj0iQWdlIiwgeWxhYj0iYXgiLCB0eXBlPSJsIixjb2w9InJlZCIpDQoNCmxlZ2VuZCgiYm90dG9tcmlnaHQiLCBjKCJGZW1hbGUiKSwgY2V4PTAuOCwgIGx0eT0xOjEgLGNvbD0icmVkIikNCmBgYA0KQ2UgcGFyYW3DqHRyZSBheCByZXByw6lzZW50ZSBsYSB0ZW5kYW5jZSBsacOpZSDDoCBs4oCZZWZmZXQgaXNvbMOpIGRlIGzigJnDomdlIHN1ciBsZXMgdGF1eCBkZSBtb3J0YWxpdMOpIGRlcyBmZW1tZXMobW95ZW5uZSB0ZW1wb3JlbGxlIGR1IGxvZ2FyaXRobWUgZHUgdGF1eCBkZSBtb3J0YWxpdMOpIHBhciDDomdlKS4gTGVzIGNvdXJiZXMgZGUgYXggc3VpdmVudCBsYSB0ZW5kYW5jZSBkZXMgY291cmJlcyBkZXMgZG9ubsOpZXMgZW1waXJpcXVlcy4gTGVzIMOiZ2VzIGZhaWJsZXMgb250IHVuZSBkw6ljcm9pc3NhbmNlIGp1c3F14oCZw6AgYXR0ZWluZHJlIHVuIG1pbmltdW0gYWJzb2x1IMOgIGRlIGzigJnDomdlIGRlIDEyIGFucywgcHVpcyB1bmUgY3JvaXNzYW5jZSBleHBvbmVudGllbGxlIGEgcGFydGlyIGRlIGwnYWdlIGRlIDYwIGFucyAuDQoNClBhcmFtw6h0cmUgIGJ4Og0KYGBge3J9DQoNCnBsb3QobGNhLmZlbWFsZSRieCwgbWFpbj0iQ29lZi4gYnggc3VyIGRvbm7DqWVzIGJyaXRhbm5pcXVlcyIsIHlsaW09YygwLDAuMDMpLHhsYWI9IkFnZSIsIHlsYWI9ImJ4IiwgdHlwZT0ibCIsY29sPSJibHVlIikNCg0KbGVnZW5kKCJ0b3ByaWdodCIsYygiRmVtYWxlIiksIGNleD0wLjgsICBsdHk9MToxLGNvbD0iYmx1ZSIpDQpgYGANCkxlIHBhcmFtw6h0cmUgYnggcmVwcsOpc2VudGVudCBs4oCZaW50ZXJhY3Rpb24gZGUgbOKAmWVmZmV0IGRlcyBhbm7DqWVzIGNhbGVuZGFpcmVzIHN1ciBsZXMgdGF1eCBkZSBtb3J0YWxpdMOpLiBDZXQgZWZmZXQgZXN0IHRvdWpvdXJzIHBvc2l0aWYgbWFpcyBsYSB2YWxldXIgbmUgY2Vzc2UgZGUgZGltaW51ZXIgYXZlYyBs4oCZw6JnZS4gQXV0cmVtZW50IGRpdCwgbOKAmWVmZmV0IGRlcyBhbm7DqWVzIGNhbGVuZGFpcmVzIGFnaXQgbWFqb3JpdGFpcmVtZW50IGF2YW50IDUwIGFucyBldCBkZSBtb2lucyBlbiBtb2lucyBhdSBkZWzDoC4gT24gY29uc3RhdGUgdW5lIGJvc3NlIMOgIDIyIGFucyBldCB1bmUgYm9zc2UgcGx1cyBsw6lnw6hyZSDDoCA2OCBhbnMuIFBvdXIgZGVzIMOiZ2VzIMOpbGV2w6lzLCBs4oCZZWZmZXQgZXN0IHF1YXNpLWluZXhpc3RhbnQgcHVpc3F1ZSBieCBlc3QgcHJlc3F1ZSBudWwuIEPigJllc3QgZXhwbGljYWJsZSBncsOiY2UgYXUgZmFpdCBxdWUgbOKAmWFtw6lsaW9yYXRpb24gZGVzIGNvbmRpdGlvbnMgZGUgdmllIGV0IGRlIGxhIG3DqWRlY2luZSBvbnQgZGltaW51w6kgbGFyZ2VtZW50IGxhIG1vcnRhbGl0w6kgaW5mYW50aWxlLiBEZSBwbHVzLCBjaGV6IGxlcyBob21tZXMsIGzigJlhbm7DqWUgYSB1biBwbHVzIGdyYW5kIGVmZmV0IHF1ZSBjaGV6IGxlcyBmZW1tZXMuDQoNCkVjYXJ0IGFic29sdSBkZXMgY29lZmZpY2llbnRzIDoNCmBgYHtyfQ0KbGNhLnRvdGFsIDwtIGxjYShkZW1vZ1VLX2xzX20sIHNlcmllcz0idG90YWwiLCBhZGp1c3Q9ImR0Iix5ZWFycyA9eWVhcnMuZml0ICxhZ2VzID0gYWdlcy5maXQpDQpwbG90KGxjYS50b3RhbCRheC1sY2EuZmVtYWxlJGF4LCBtYWluPSJFY2FydCBhdmVjIHBvcHVsYXRpb24gdG90YWxlIiwgeGxhYj0iQWdlIHgiLCB5bGFiPWV4cHJlc3Npb24ocGFzdGUoRGVsdGEsICIgYXgiKSksIHR5cGU9ImwiICwgY29sPSdncmVlbicpDQpsZWdlbmQoInRvcHJpZ2h0IixjKCJGZW1hbGUiKSwgY2V4PTAuOCwgbHR5PTE6MSkNCmBgYA0KT24gY29uc3RhdGUgdW4gcGx1cyBncmFuZCDDqWNhcnQgZGUgbW9ydGFsaXTDqSBjaGV6IGxlcyBmZW1tZXMgZW50cmUgMjAgZXQgMzAgYW5zIHF1ZSBjaGV6IGxlcyBob21tZXMganVzcXXigJnDoCBs4oCZw6JnZSBkZSA3MCBhbnMuIExhIHRlbmRhbmNlIHPigJlpbnZlcnNlIHB1aXNxdeKAmWF1IGRlbMOgLCBs4oCZw6ljYXJ0IGRlIG1vcnRhbGl0w6kgZXN0IHBsdXMgZ3JhbmQgcG91ciBsZXMgaG9tbWVzLg0KDQpQYXJhbcOodHJlICBrdDoNCmBgYHtyfQ0KcGxvdChsY2EuZmVtYWxlJGt0LCB4bGFiPSJZZWFyIiwgbWFpbj0iQ29lZi4ga3Qgc3VyIGRvbm7DqWVzIGJyaXRhbm5pcXVlcyIseWxhYj0ia3QiLCB0eXBlPSJsIix5bGltPWMoLTEwMCwgMTAwKSkNCmxpbmVzKGxjYS5mZW1hbGUkeWVhciwgeT1sY2EuZmVtYWxlJGt0LCBtYWluPSJrdCIsIGx0eT0yICwgY29sID0icmVkIikNCmxlZ2VuZCgidG9wcmlnaHQiLCBjKCJGZW1hbGUiKSwgY2V4PTAuOCwgbHR5PTE6MSwgY29sID0icmVkIikNCmBgYA0KTGEgdmFsZXVyICBrdCBlc3QgZW4gY2h1dGUgY29uc3RhbnRlLiBPbiByZW1hcnF1ZSB1biBwaWMgZGUgbGEgdmFsZXVyIGRlIGt0IGF1dG91ciBkZSBsYSBkZXV4acOobWUgZ3VlcnJlIG1vbmRpYWxlLg0KYGBge3J9DQojdG90YWwNCnBsb3QobGNhLnRvdGFsJHJlc2lkdWFscykNCiNmZW1hbGUNCnBsb3QobGNhLmZlbWFsZSRyZXNpZHVhbHMpDQpgYGANCiMgLSBpbnTDqXJwcsOpdGF0aW9uIGRlcyByw6lzaWR1cyA6DQojT24gY29uc3RhdGUgcXVlIGxhIHZhcmlhbmNlIG7igJllc3QgcGx1cyBzdGFibGUgcG91ciBsZXMgYWdlcyBhIHBhcnRpciBkZSAwIMOgIDYwIGFucyBldCBlc3QgaW5mw6lyaWV1ciDDoCAwLjUgICANCiNsZSBtb2TDqWxlIG5lIHNlbWJsZSBwYXMgYWRhcHTDqSDDoCBsYSBkZXNjcmlwdGlvbiBkZXMgdGF1eCBkZSBtb3J0YWxpdMOpIGRlcyBhZ8OpcyBtb2lucyBkZSA2MCBhbnMuDQoNCmBgYHtyfQ0KUkVTPXJlc2lkdWFscyhsY2EuZmVtYWxlLCJwZWFyc29uIikNCmNvbHI9ZnVuY3Rpb24oaykgcmFpbmJvdygxMTApW2sqMTAwXQ0KY291bGV1cj1WZWN0b3JpemUoY29scikoc2VxKC4wMSwxLGJ5PS4wMSkpDQpwbG90KHJlcChSRVMkeSxsZW5ndGgoUkVTJHgpKSwoUkVTJHopLGNvbD1jb3VsZXVyW3JlcChSRVMkeCxlYWNoPWxlbmd0aChSRVMkeSkpLVJFUyR4WzFdKzFdKQ0KcGxvdChyZXAoUkVTJHgsZWFjaD1sZW5ndGgoUkVTJHkpKSx0KFJFUyR6KSxjb2w9Y291bGV1cltyZXAoUkVTJHksbGVuZ3RoKFJFUyR4KSkrMV0pDQpgYGANCg0KYGBge3J9DQojZW4gdXRpbGlzYW50IGxhIGZvbmN0aW9uIGZpdCBkdSBwYWNrYWdlICIiIlN0TW9NbyIiIiA6DQojIE1vZGVsIGRlIExlZSBDYXJ0ZXIgZW4gdXRpbGlzYW50IGxlIHBhY2thZ2UgIiIiU3RNb01vIiIiIA0KIyBwb3VyIGxlcyBwYXJhbcOpdHJlcyDDqXN0aW3DqXMgb24gYSBsZXMgbWVtZXMgaW50w6lycHLDqXRhdGlvbnMNCmBgYA0KDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJTdE1vTW8iKQ0KbGlicmFyeShTdE1vTW8pDQpgYGANCg0KYGBge3J9DQojX19fX19fX19fX19fX19fX3BvcHVsYXRpb24gZsOpbWluaW5lX19fX19fX19fX19fX19fXyAgOg0KDQpVSy5zdG1vbW8uZjwtU3RNb01vRGF0YShkYXRhPWRlbW9nVUtfbHNfbSAsc2VyaWVzID0gImZlbWFsZSIsdHlwZT0iY2VudHJhbCIpDQojYWp1c3RlbWVudCBkdSBtb2RlbCAoZml0dGluZykgOg0KTEMgPC0gbGMobGluayA9ICJsb2ciICkNCkxjZml0IDwtIGZpdChMQywgZGF0YSA9IGNlbnRyYWwyaW5pdGlhbChVSy5zdG1vbW8uZiksIGFnZXMuZml0ID0gYWdlcy5maXQsICB5ZWFycy5maXQgPSB5ZWFycy5maXQpDQoNCiNuYW1lcyhMY2ZpdCkNCiMgcGFyYW3DqXRyZSBheCA6DQpwbG90KExjZml0JGF4LHR5cGU9J2wnLGNvbD0icmVkIikNCiMgcGFyYW3DqXRyZSBieCA6Og0KcGxvdChMY2ZpdCRieCx0eXBlPSdsJyxjb2w9ImJsdWUiKQ0KIyBwYXJhbcOpdHJlIGt0IDoNCnBsb3QoTGNmaXQkeWVhcnMsTGNmaXQka3QsdHlwZT0nbCcsY29sPSJncmVlbiIpDQoNCiMgYW5hbHlzZSBkZXNpZHVzTGVsbGVzIDoNCkxDcmVzMyA8LSByZXNpZHVhbHMoTGNmaXQpDQpwbG90KExDcmVzMyx0eXBlID0gInNjYXR0ZXIiKSAjIFNjYXR0ZXIgcGxvdHMgb2YgZGV2aWFuY2UgcmVzaWR1YWxzIGZvciBtb2RlbHMgTEMNCmBgYA0KQ2UgcHJvZ3JhbW1lIG5vdXMgcGVybWV0IGRlIHNpbXVsZXIgbGVzIHRyYWplY3RvaXJlcyBmdXR1cmVzIGRlIGzigJnDqWNoYW50aWxsb24gw6AgcGFydGlyIGTigJl1biBtb2TDqGxlIGRlIG1vcnRhbGl0w6kgc3RvY2hhc3RpcXVlLCBkYW5zIG5vdHJlIGNhcyBj4oCZZXN0IGxlIG1vZMOobGUgTGVlLUNhcnRlciBxdWkgcmVhbGlzZSBjZXR0ZSBzaW11bGF0aW9uLiBQYXIgZMOpZmF1dCwgdW4gQVJJTUEoMSwgMSwgMCkgYXZlYyB1bmUgY29uc3RhbnRlIGVzdCB1dGlsaXPDqSBkYW5zIGNlIHByb2dyYW1tZS4NCg0KIyBRdWVzdGlvbiAzIDoNClNpbXVsZXIgdW4gbm9tYnJlIE49IDUwMDAgZGUgdHJhamVjdG9pcmVzIHByb2pldMOpZXMgc3VyIDI1IGFucyBkZXMgdGF1eCBkZSBtb3J0YWxpdMOpIGZ1dHVycyDDoCBs4oCZYWlkZSBkZSBsYSBmb25jdGlvbiBzaW11bGF0ZS4NCuKAoiBEw6ljcmlyZSAoZW4gZMOpdGFpbCkgY2UgcXVlIGZhaXQgbGUgcHJvZ3JhbW1lLg0K4oCiIEFmZmljaGVyIGxlcyBsb2cgdGF1eCBkZSBtb3J0YWxpdMOpcyBwcm9qZXTDqXMgcG91ciBsYSBjb2hvcnRlIGTigJlhc3N1csOpcywgw6AgcGFydGlyIGRlIGxhIGRhdGUgZGUgZMOpYnV0IGR1IGNvbnRyYXQuDQrigKIgQWZmaWNoZXIgbOKAmWhpc3RvZ3JhbW1lIGRlcyBlc3DDqXJhbmNlcyBkZSB2aWUgY29ob3J0ZSDDoCBs4oCZw6JnZSBkZSA2NSBhbnMgcG91ciBsZXMgY29ob3J0ZXMgZOKAmWluZGl2aWR1cw0KYXlhbnQgNjUgYW5zIGVuIDIwMDAgZXQgNjUgYW5zIDIwMTAsIGV0IHBvdXIgbGEgY29ob3J0ZSBk4oCZYXNzdXLDqXMuIENvbW1lbnRlci4NCg0KYGBge3J9DQojIEluc3RhbGxlciBsZXMgcGFja2FnZXMgbsOpY2Vzc2FpcmVzDQppbnN0YWxsLnBhY2thZ2VzKCJsaWZlY29udGluZ2VuY2llcyIpDQpgYGANCg0KMSlTaW11bGVyIHVuIG5vbWJyZSBOPSA1MDAwIGRlIHRyYWplY3RvaXJlcyBwcm9qZXTDqWVzIHN1ciAyNSBhbnMgZGVzIHRhdXggZGUgbW9ydGFsaXTDqSBmdXR1cnMgw6AgbOKAmWFpZGUgZGUgbGEgZm9uY3Rpb24gc2ltdWxhdGUgOg0KDQpgYGB7cn0NCiNTaW11bGF0aW9uIG9mIGZ1dHVyZSBtb3J0YWxpdHkgcmF0ZXMNCk4gPC0gNTAwMCAjIE51bWJlciBvZiBzaW11bGF0aW9ucw0KeWVhcnMucHJvaiA8LSAyMDIxOjIwNDYgIyBQcm9qZWN0aW9uIHllYXJzIChuZXh0IDI1IHllYXJzKQ0KTENzaW0gPC0gc2ltdWxhdGUoTGNmaXQsIGggPSBsZW5ndGgoeWVhcnMucHJvaikgLCBtZXRob2QgPSBtZWFuICwgbnNpbSA9IE4gKQ0KDQojIFRyb3V2ZXIgbCdpbmRleCBkZSBsJ2FubsOpZSBkZSBkw6lidXQgZHUgY29udHJhdA0Kc3RhcnRfeWVhcl9pbmRleCA8LSB3aGljaCh5ZWFycy5wcm9qID09IDIwMjEpDQpwcmludChMQ3NpbSkNCmBgYA0KDQoNCjIpQWZmaWNoZXIgbGVzIGxvZyB0YXV4IGRlIG1vcnRhbGl0w6lzIHByb2pldMOpcyBwb3VyIGxhIGNvaG9ydGUgZOKAmWFzc3Vyw6lzLCDDoCBwYXJ0aXIgZGUgbGEgZGF0ZSBkZSBkw6lidXQgZHUgY29udHJhdCA6DQpgYGB7cn0NCnBsb3QoTGNmaXQkeWVhcnMsIChMY2ZpdCREeHQgLyBMY2ZpdCRFeHQpWyI2NSIsIF0sIA0KICAgICB4bGltID0gcmFuZ2UoTGNmaXQkeWVhcnMsIExDc2ltJHllYXJzKSwNCiAgICAgeWxpbSA9IHJhbmdlKChMY2ZpdCREeHQgLyBMY2ZpdCRFeHQpWyI2NSIsIF0sIExDc2ltJHJhdGVzWyI2NSIsICwgXSksIA0KICAgICB0eXBlID0gImwiLCB4bGFiID0gInllYXIiLCB5bGFiID0gInJhdGUiLCANCiAgICAgbWFpbiA9ICJMZWUtQ2FydGVyOiBUYXV4IGRlIG1vcnRhbGl0w6lzIHNpbXVsw6lzIMOgIHBhcnRpciBkZSAyMDIyIikNCm1hdGxpbmVzKExDc2ltJHllYXJzLCBMQ3NpbSRyYXRlc1siNjUiLCAsIF0sIHR5cGUgPSAibCIsIGx0eSA9IDEpDQoNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGZhbnBsb3QpDQpgYGANCg0KYGBge3J9DQpwcm9icyA9IGMoMi41LCAxMCwgMjUsIDUwLCA3NSwgOTAsIDk3LjUpDQoNCnF4dCA8LSBMY2ZpdCREeHQgLyBMY2ZpdCRFeHQNCm1hdHBsb3QoTGNmaXQkeWVhcnMsIHQocXh0W2MoIjY1IiwgIjY1IiwgIjY1IiksIF0pLA0KIHhsaW0gPSBjKDE5NjUsIDIwNDMpLCB5bGltID0gYygwLjAwMjUsIDAuMiksIHBjaCA9IDIwLCBjb2wgPSAiYmxhY2siLA0KIGxvZyA9ICJ5IiwgeGxhYiA9ICJ5ZWFyIiwgeWxhYiA9ICJtb3J0YWxpdHkgcmF0ZSAobG9nIHNjYWxlKSIpDQpmYW4odChMQ3NpbSRyYXRlc1siNjUiLCAsIF0pLCBzdGFydCA9IDIwMjIsIHByb2JzID0gcHJvYnMsIG4uZmFuID0gNCwgZmFuLmNvbCA9IGNvbG9yUmFtcFBhbGV0dGUoYygicmVkIiwgIndoaXRlIikpLCBsbiA9IE5VTEwpDQpgYGANCjMpQWZmaWNoZXIgbOKAmWhpc3RvZ3JhbW1lIGRlcyBlc3DDqXJhbmNlcyBkZSB2aWUgY29ob3J0ZSDDoCBs4oCZw6JnZSBkZSA2NSBhbnMgcG91ciBsZXMgY29ob3J0ZXMgZOKAmWluZGl2aWR1cw0KYXlhbnQgNjUgYW5zIGVuIDIwMDAgZXQgNjUgYW5zIDIwMTAsIGV0IHBvdXIgbGEgY29ob3J0ZSBk4oCZYXNzdXLDqXMgOg0KYGBge3J9DQp0YWI8LXJlYWQudGFibGUoZmlsZT0iZmx0cGVyXzF4MS50eHQiLCBoZWFkZXIgPSBUUlVFLHNraXA9MSwgc2VwID0gIiIsIGRlYyA9ICIuIikNCmhlYWQodGFiKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkobGlmZWNvbnRpbmdlbmNpZXMpDQpgYGANCg0KDQpgYGB7cn0NCiMjIyMjIGFubsOpZSAyMDAwICMjIyMjIw0KVUtfMjAwMDwtIHRhYlt3aGljaCh0YWIkWWVhciA9PSAyMDAwKSxuYW1lcyh0YWIpXQ0KZGZfVUtfMjAwMDwtZGF0YS5mcmFtZShVS18yMDAwKQ0KZGZfVUtfMjAwMCRBZ2U8LWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX1VLXzIwMDAkQWdlKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZGZfVUtfMjAwMCRBZ2VbMTExXTwtMTEwDQpURF8yMDAwIDwtIG5ldygibGlmZXRhYmxlIiwgeD1kZl9VS18yMDAwJEFnZSwgbHg9IGRmX1VLXzIwMDAkbHgsbmFtZT0iVUsiKQ0KRVNQXzIwMDA9ZXhuKFREXzIwMDAseD02NSkNCkVTUF8yMDAwDQpgYGANCg0KDQpgYGB7cn0NCiMjIyMjIGFubsOpZSAyMDEwICMjIyMjIw0KVUtfMjAxMDwtIHRhYlt3aGljaCh0YWIkWWVhciA9PSAyMDEwKSxuYW1lcyh0YWIpXQ0KZGZfVUtfMjAxMDwtZGF0YS5mcmFtZShVS18yMDEwKQ0KZGZfVUtfMjAxMCRBZ2U8LWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX1VLXzIwMTAkQWdlKSkNCmBgYA0KYGBge3J9DQpkZl9VS18yMDEwJEFnZVsxMTFdPC0xMTANClREXzIwMTAgPC0gbmV3KCJsaWZldGFibGUiLCB4PWRmX1VLXzIwMTAkQWdlLCBseD0gZGZfVUtfMjAxMCRseCxuYW1lPSJVSyIpDQpFU1BfMjAxMD1leG4oVERfMjAxMCx4PTY1KQ0KRVNQXzIwMTANCmBgYA0KYGBge3J9DQojIyMjIyBsYSBjb2hvcnRlIGRlIHRvdXRlcyBsZXMgYXNzdXJlcyBk4oCZYXNzdXLDqXMgIyMjIyMjDQpiYXIgPC0gc3Vic2V0KHRhYiwgQWdlID09IDY1KQ0KZXNwX3RvdGFsZT1tZWFuKGJhciRleCkNCmVzcF90b3RhbGUNCg0KYGBgDQoNCmBgYHtyfQ0KIyMjIyBIaXN0b2dyYW1lICMjIyMjDQpraz1jKEVTUF8yMDAwLEVTUF8yMDEwLGVzcF90b3RhbGUpDQpiYXJwbG90KGtrLA0KbWFpbiA9ICJFc3BlcmFuY2VzIGRlIHZpZSIsDQp4bGFiID0gIkVzcGVyYW5jZSAiLA0KeWxhYiA9ICJBZ2UiLA0KbmFtZXMuYXJnID0gYygiMjAwMCIsIjIwMTAiLCJUb3RhbCIpLA0KY29sID0gImRhcmtyZWQiLA0KaG9yaXogPSBGQUxTRSkNCmBgYA0KIyMjIyNPbiByZW1hcnF1ZSBxdWUgbOKAmWVzcGVyYW5jZSBkZSB2aWUgZGUgbOKAmWFubsOpZSAyMDEwIGVzdCBtZWlsbGV1cmUgcXVlIGzigJlhbm7DqWUgMjAwMCBjZWxhIHPigJlleHBsaXF1ZSBwYXIgbGUgI2RldmVsb3BwZW1lbnQgZHUgc3lzdGVtZSBtZWRpY2FsZS4gUGFyIHJhcHBvcnQgw6AgbOKAmWVzcGVyYW5jZSB0b3RhbGUgb24gcmVtYXJxdWUgcXVlIHNhIHZhbGV1ciBlc3QgZW4gZGVzc291cyBkZXMgZGV1eCBhdXRyZXMgdmFsZXVycyBwdWlzcXVlIGNhIGluY2x1dCB0b3V0ZXMgbGVzIGF1dHJlcyBhbm7DqWVzIG91IGzigJllc3BlcmFuY2UgZGUgdmllIGVzdCBtb2lucyBpbXBvcnRhbnRlDQoNClF1ZXN0aW9uIDQgOg0KQ3LDqWVyIHVuZSBmb25jdGlvbiBSIGNhbGN1bGFudCBsYSB2YWxldXIgYWN0dWVsbGUgcHJvYmFibGUgZGUgbGEgcmVudGUgdmlhZ8OocmUgw6AgdGVybWUgYW50aWNpcMOpLCDDqXRhbnQgZG9ubsOpZSB1bmUgbGlzdGUgZGUgdGF1eCBkZSBtb3J0YWxpdMOpDQpgYGB7cn0NCkZlbWFsZVVLPC1yZWFkLnRhYmxlKGZpbGU9ImZsdHBlcl8xeDEudHh0IiwgaGVhZGVyID0gVFJVRSxza2lwPTEsIHNlcCA9ICIiLCBkZWMgPSAiLiIpDQoNCg0KVkFQPWZ1bmN0aW9uKHgsdGFiLGksIHllYXIpew0KICAgICAgICBVS19hbm5lZTwtIHRhYlt3aGljaCh0YWIkWWVhciA9PSB5ZWFyKSxuYW1lcyh0YWIpXQ0KICAgICAgICBkZl9VS19hbm5lZTwtZGF0YS5mcmFtZShVS19hbm5lZSkNCiAgICAgICAgZGZfVUtfYW5uZWUkQWdlPC1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9VS19hbm5lZSRBZ2UpKQ0KICAgICAgICBkZl9VS19hbm5lZSRBZ2VbMTExXTwtMTEwDQogICAgICAgIFREX2FubmVlIDwtIG5ldygibGlmZXRhYmxlIiwgeD1kZl9VS19hbm5lZSRBZ2UsIGx4PSBkZl9VS19hbm5lZSRseCxuYW1lPSJVSyIpDQogICAgICAgIFZBUF9mID0gYXhuKFREX2FubmVlLCB4PXgsIGk9aSxuPTI1KQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuKFZBUF9mKQ0KfQ0KI1Rlc3QgZGUgbGEgZm9uY3Rpb24gDQpwcmludChWQVAoNjAsRmVtYWxlVUssMC4wMywxOTYwKSkNCmBgYA0KUXVlc3Rpb24gNSA6DQpDYWxjdWxlciBsYSBWQVAgZHUgY29udHJhdCBwb3VyIGNoYWN1biBkZXMgc2PDqW5hcmlvcyBkZSBtb3J0YWxpdMOpIGfDqW7DqXLDqXMgw6AgbGEgcXVlc3Rpb24gcHLDqWPDqWRlbnRlLiBEb25uZXIgbGEgdmFsZXVyIG1veWVubmUgb2J0ZW51ZSBldCBzYSB2YXJpYW5jZS4gUHJvcG9zZXIgdW5lIHRhcmlmaWNhdGlvbg0KDQpgYGB7cn0NClZBUF9zY2VuYXJpbzE9VkFQKDY1LEZlbWFsZVVLLDAuMDMsMjAwMCkNCmBgYA0KYGBge3J9DQpWQVBfc2NlbmFyaW8yPVZBUCg2NSxGZW1hbGVVSywwLjAzLDIwMTApDQpgYGANCmBgYHtyfQ0KYyhWQVBfc2NlbmFyaW8xLFZBUF9zY2VuYXJpbzIpDQpgYGANCmBgYHtyfQ0KbWVhbihjKFZBUF9zY2VuYXJpbzEsVkFQX3NjZW5hcmlvMikpDQpgYGANCmBgYHtyfQ0Kc2QoYyhWQVBfc2NlbmFyaW8xLFZBUF9zY2VuYXJpbzIpKQ0KYGBgDQojT24gcmVtYXJxdWUgcXVlIGxhIFZBUCBkYW5zIGxlIHByZW1pZXIgc2NlbmFyaW8gY2FsY3Vsw6kgc3VyIGRlcyBwZXJzb25uZXMgYXlhbnQgNjUgYW5zIGVuIDIwMDAgZXN0IG1vaW5zIGltcG9ydGFudCBxdWUgIyBsZSBzY2VuYXJpbyAyIG91IGNhbGN1bMOpIHN1ciBkZXMgcGVyc29ubmVzIGF5YW50IDY1IGFucyBlbiAyMDEwDQoNClRhcmlmaWNhdGlvbiA6DQojbGVzIHRhdXggZGUgbm90cmUgY29ob3J0ZSBkZXMgaW5kaXZpZHVzIG7DqWVzIGVuIDE5NjAgOg0KYGBge3J9DQpsaWJyYXJ5KGRlbW9ncmFwaHkpDQpgYGANCg0KYGBge3J9DQpjaG9zZW5fY29ob3J0PTE5NjANCmxjX2hpc3RvcmljYWxfcmF0ZXMgPC0gZXh0cmFjdENvaG9ydChmaXR0ZWQoTGNmaXQsIHR5cGUgPSAicmF0ZXMiKSwgY29ob3J0ID0gY2hvc2VuX2NvaG9ydCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KbGNfc2ltX3JhdGVzIDwtIGV4dHJhY3RDb2hvcnQoTENzaW0kcmF0ZXMsY29ob3J0ID0gY2hvc2VuX2NvaG9ydCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmxjX3JhdGVzXzE5NjAgPC0gYyhsY19oaXN0b3JpY2FsX3JhdGVzLGxjX3NpbV9yYXRlcykNCg0KbGNfcXhfMTk2MCA8LW14MnF4KGxjX3JhdGVzXzE5NjApDQoNCg0KI3RyYW5zZm9ybWF0aW9uIGFjdHVhcmlhbCB0YWJsZSBlbiBsaWZldGFibGU6DQpsY19saWZldGFibGVfMTk2MCA8LSBwcm9iczJsaWZldGFibGUocHJvYnM9bGNfcXhfMTk2MCx0eXBlID0gInF4IiwgbmFtZSA9IHBhc3RlKCJMQyIsIjE5NjAiLCJsdCIsc2VwPSJfIikpDQoNCmxjX2FjdHRibF8xOTYwPC1uZXcoImFjdHVhcmlhbHRhYmxlIix4PWxjX2xpZmV0YWJsZV8xOTYwQHgsbHg9bGNfbGlmZXRhYmxlXzE5NjBAbHgpDQoNClZBUF9oaXN0X3Byb2pldCA9IGF4bihsY19hY3R0YmxfMTk2MCwgeD02MCwgbj0yNSkgIyBvbiBhIHByb2pldMOpIHF1ZSAyNSBhbnMgc2Vsb24gbGUgcXVlc3Rpb24gIjMiDQpWQVBfaGlzdF9wcm9qZXQNCmBgYA0KYGBge3J9DQpQcmltZV9Qcm9wb3NlID0gYXhuKGxjX2FjdHRibF8xOTYwLCB4PTYwLCBtPTI1KS9heG4obGNfYWN0dGJsXzE5NjAsIHg9NjAsIG09MSxuPTI1KSANClByaW1lX1Byb3Bvc2UNCmBgYA0KDQpRdWVzcmlvbjYgOg0KUXVlbGxlcyBzb250IGxlcyBhdXRyZXMgc291cmNlcyBk4oCZaW5jZXJ0aXR1ZGVzID8NCg0KDQpMYSBWQVAgZMOpcGVuZCBkZSBkZXV4IGZhY3RldXJzIHF1aSBzb250IGzigJnDomdlIGRlIGzigJlhc3N1csOpIGV0IGzigJlpbnRlcmV0IGkNCg0KUGFyIHJhcHBvcnQgw6AgbOKAmcOiZ2UgbGEgVkFQIGNyb2l0IGVuIGZvbmN0aW9uIGRlIGzigJnDomdlIChjb3Jyw6lsYXRpb24gcG9zaXRpdmUpIHZ1IHF1ZSBsYSBwcm9iYWJpbGl0w6kgZGUgZMOpY8OocyBhdWdtZW50ZSBlbiBmb25jdGlvbiBkZSBjZSBkZXJuaWVyIC4NCg0KUGFyIHJhcHBvcnQgw6AgbOKAmWludGVyZXQ6IExhIHZhbGV1ciBhY3R1ZWxsZSBwcm9iYWJsZSBWQVAgYXVnbWVudGUgbG9yc3F1ZSBsZSB0YXV4IHRlY2huaXF1ZSBkaW1pbnVlLg0KDQoNCg==